package yz.mr.FiltrationText2;

import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

/**
 * * Reduce阶段：
 * *      将相同班级的学生数据汇聚在一个Reduce中进行处理，
 * *      需要取出对应的学生信息，并包装成一个学生对象，并将所有的学生对象存储在一个List集合中，
 * *      对应List集合的数据在做数据排序，对应取出下标的数据
 */
public class FiltrationText2Reduce extends Reducer<Text, Text, NullWritable, Text> {  //这里的Text可以改成自定义的类Student
    /**
     * @param key     null
     * @param values  最后的班级前三名
     * @param context
     * @throws IOException
     * @throws InterruptedException
     */
    @Override
    protected void reduce(Text key, Iterable<Text> values, Reducer<Text, Text, NullWritable, Text>.Context context) throws IOException, InterruptedException {
        //创建列表，并对列表的学生对象排序
        ArrayList<Student> students = new ArrayList<>();
        //相同班级中所有的数据
        for (Text student : values) {
            String[] split = student.toString().split("\t");
            String id = split[0];
            String[] other = split[1].split(",");
            //1500100001	施笑槐,         22,          女,        文科六班 ,     406
            //String id, String name, String age, String sex, String clazz, int score
            Student AllStu = new Student(id, other[0], other[1], other[2], other[3], Integer.parseInt(other[4]));
            //将所有的学生写入到这个列表中去
            students.add(AllStu);
        }

        //现在对list列表的里面的数据进行排序
        //Collections是java中的工具类，该类中有一些函数进行对数据排序
        Collections.sort(students, new Comparator<Student>() {
            /**
             * 提供的comparator中需要自己定义，在函数自己定义比较逻辑
             * @param o1 the first object to be compared.
             * @param o2 the second object to be compared.
             * @return
             */
            @Override
            public int compare(Student o1, Student o2) {
//                //这种默认的是升序，所以我们就要改成降序  这里就是取反
//                if (o1.score>o2.score){
//                    return -1;  //升序的话是返回1 ，降序返回-1
//                }
//                else if (o1.score == o2.score){
//                    return 0;
//                }
//                else {
//                    return 1;
//                }
//            }

                //也可以使用三目运算符
                return -(o1.score > o2.score ? 1 : (o1.score == o2.score ? 0 : -1));
            }

        });
        Student student01 = students.get(0);
        context.write(NullWritable.get(), new Text(student01.toString())); //如果改完之后就可以用Student
        Student student02 = students.get(1);
        context.write(NullWritable.get(), new Text(student02.toString()));
        Student student03 = students.get(2);
        context.write(NullWritable.get(), new Text(student03.toString()));


    }
}
